package core.exception;


/**
 * 業務例外クラス
 *
 * @author Tadashi Nakayama
 * @version 1.0.0
 */
public class LogicalException extends RuntimeException {
	/** serialVersionUID */
	private static final long serialVersionUID = -7185810040168410941L;

	/** 復帰値 */
	private final String rc;
	/** ステータス */
	private final String status;
	/** ステータスコード */
	private final int sc;

	/**
	 * コンストラクタ
	 *
	 * @param message 詳細内容
	 */
	public LogicalException(final String message) {
		this(message, null, null, 0);
	}

	/**
	 * コンストラクタ
	 *
	 * @param msg 詳細内容
	 * @param sts ステータス
	 * @param ret 復帰値
	 * @param scode ステータスコード
	 */
	public LogicalException(final String msg, final String sts,
			final String ret, final int scode) {
		super(msg);
		this.status = sts;
		this.rc = ret;
		this.sc = scode;
	}

	/**
	 * ファクトリ
	 *
	 * @param msg メッセージ
	 * @param sts ステータス
	 * @return LogicalException
	 */
	public static LogicalException create(final String msg, final String sts) {
		return create(null, msg, sts);
	}

	/**
	 * ファクトリ
	 *
	 * @param ret 復帰値
	 * @param msg メッセージ
	 * @param sts ステータス
	 * @return LogicalException
	 */
	public static LogicalException create(final String ret,
			final String msg, final String sts) {
		return new LogicalException(msg, sts, ret, 0);
	}

	/**
	 * ファクトリ
	 *
	 * @param ret 復帰値
	 * @return LogicalException
	 */
	public static LogicalException create(final String ret) {
		return new LogicalException(null, null, ret, 0);
	}

	/**
	 * ファクトリ
	 *
	 * @param sc ステータスコード
	 * @return LogicalException
	 */
	public static LogicalException create(final int sc) {
		return new LogicalException(null, null, null, sc);
	}

	/**
	 * ファクトリ
	 *
	 * @param sc ステータスコード
	 * @param msg メッセージ
	 * @return LogicalException
	 */
	public static LogicalException create(final int sc, final String msg) {
		return new LogicalException(msg, null, null, sc);
	}

	/**
	 * 復帰値取得
	 *
	 * @return 復帰値
	 */
	public final String getReturnCode() {
		return this.rc;
	}

	/**
	 * ステータス取得
	 *
	 * @return ステータス
	 */
	public final String getStatus() {
		return this.status;
	}

	/**
	 * ステータスコード取得
	 *
	 * @return ステータスコード
	 */
	public final int getStatusCode() {
		return this.sc;
	}
}
